#!/usr/bin/env python
# -*- coding: UTF8 	-*-

from GladeConnect import GladeConnect
import completion
import SimpleTree
import ifd
import gtk
import dialogos
import debugwindow
import sys
import comunes
from psycopg2 import connect
from strSQL.basicas import strSelectInsumo
import treetohtml

(CODIGO,
 DESCRIPCION) = range (2)

class wnInsumo (GladeConnect):
    def __init__ (self, conexion=None, padre=None, root="wnInsumo"):
        GladeConnect.__init__(self, "glade/wnInsumo.glade", root)
        self.cnx = conexion
        self.cursor = self.cnx.cursor()
        self.padre = padre
        if padre is None:
            self.wnInsumo.maximize()
            self.frm_padre = self.wnInsumo
        else:
            self.frm_padre = self.padre.frm_padre
            
        self.crea_columnas()
        self.carga_datos()
        
    def crea_columnas(self):
        columnas = []
        columnas.append([CODIGO, "Código", "str"])
        columnas.append([DESCRIPCION, "Descripción", "str"])
    
        self.modelo = gtk.ListStore(int, str)
        SimpleTree.GenColsByModel(self.modelo, columnas, self.treeInsumo)
        self.col_data = [x[0] for x in columnas]
        
    def on_btnImprimir_clicked(self, btn=None):
        t = treetohtml.TreeToHTML(self.treeInsumo,"Insumo", self.col_data)
        t.show()
        
    def carga_datos(self, where=None):
        if where is None:
            self.modelo = ifd.ListStoreFromSQL(self.cnx, strSelectInsumo)
            self.treeInsumo.set_model(self.modelo)
        else:
            try:
                sql = strSelectInsumo
                sql = sql.replace("ORDER", where)
                self.modelo = ifd.ListStoreFromSQL(self.cnx, sql)
                self.treeInsumo.set_model(self.modelo)
            except:
                self.modelo = ifd.ListStoreFromSQL(self.cnx, strSelectInsumo)
                self.treeInsumo.set_model(self.modelo)
    
    def on_treeInsumo_row_activated(self, tree=None, path=None, col=None):
        self.on_btnPropiedades_clicked()
    
    def on_btnAnadir_clicked(self, btn=None):
        dlg = dlgInsumo(self.cnx, self.frm_padre, False)
        dlg.editando = False
        band = False
        while not band:
            response = dlg.dlgInsumo.run()
            if response == gtk.RESPONSE_OK:
                if dlg.response != None:
                    self.modelo.append(dlg.response)
                    band = True
            else:
                band = True
        
        dlg.dlgInsumo.destroy()
        
    def on_btnQuitar_clicked(self, btn=None):
        model, it = self.treeInsumo.get_selection().get_selected()
        if model is None or it is None:
            return
        codigo = model.get_value(it, CODIGO)
        descripcion = model.get_value(it, DESCRIPCION)
        
        if dialogos.yesno("¿Desea eliminar el Insumo <b>%s</b>?\nEsta Acción no se puede deshacer"%descripcion, self.frm_padre)==gtk.RESPONSE_YES:
            llaves = {'codigo_insumo':codigo}
            sql = ifd.deleteFromDict("traza.insumo", llaves)
            try:
                self.cursor.execute(sql, llaves)
                model.remove(it)
            except:
                print sys.exc_info()[1]
                dialogos.error("<b>NO SE PUEDE ELIMINAR</b>\nEl insumo <b>%s</b> esta relacionado con recepción de insumo."%descripcion)
    
    def on_btnPropiedades_clicked(self, btn=None):
        model, it = self.treeInsumo.get_selection().get_selected()
        if model is None or it is None:
            return
        
        dlg = dlgInsumo(self.cnx, self.frm_padre, False)
        dlg.entCodigo.set_text(model.get_value(it, CODIGO))
        dlg.entDescripcionInsumo.set_text(model.get_value(it,DESCRIPCION))
        dlg.editando = True
        response = dlg.dlgInsumo.run()
        if response == gtk.RESPONSE_OK:
            self.modelo.clear()
            self.carga_datos()
            

    def on_btnCerrar_clicked(self, btn=None):
        if self.padre is None:
            self.on_exit()
        else:
            self.padre.remove_tab("Insumo")
            
    def on_entFiltroInsumo_changed(self, entry):
        try:
            self.modelo.clear()
        except:
            pass
        where = "WHERE descripcion_insumo LIKE '%s' ORDER " % ("%" + self.entFiltroInsumo.get_text().upper() + "%")
        self.carga_datos(where)


class dlgInsumo(GladeConnect):
    def __init__(self, conexion=None, padre=None, editando=False):
        GladeConnect.__init__(self, "glade/wnInsumo.glade", "dlgInsumo")
        self.dlgInsumo.show_all()
        self.cnx = conexion
        self.cursor = self.cnx.cursor()
        self.dlgInsumo.set_transient_for(padre)
        self.editando = editando
        self.response = None
        
    def on_btnAceptar_clicked(self, btn=None):
        if self.entDescripcionInsumo.get_text() == "":
            dialogos.error("El campo <b>Descripción</b> no puede estar vacío")
            self.entDescripcionInsumo.grab_focus()
            return
        
        campos = {}
        llaves = {}
    
        campos['descripcion_insumo'] = self.entDescripcionInsumo.get_text().upper()
    
        if not self.editando:
            self.cursor.execute("select nextval('traza.insumo_codigo_insumo_seq')")
            r = self.cursor.fetchall()
            self.entCodigo.set_text(str(r[0][0]))
            campos['codigo_insumo'] = self.entCodigo.get_text()
            sql = ifd.insertFromDict("traza.insumo", campos)
        else:
            llaves['codigo_insumo'] = self.entCodigo.get_text()
            sql, campos = ifd.updateFromDict("traza.insumo", campos, llaves)
        
        try:
            self.cursor.execute(sql,campos)
            self.dlgInsumo.hide()
            
            self.response = [self.entCodigo.get_text(),
                                    self.entDescripcionInsumo.get_text().upper()]
        except:
            print sys.exc_info()[1]
            descripcion_insumo = self.entDescripcionInsumo
            dialogos.error("En Sistema ya existe el insumo <b>%s</b>"%campos['descripcion_insumo'])
            self.entDescripcionInsumo.grab_focus()
            
    
        
    def on_btnCancelar_clicked(self, btn=None):
        self.dlgInsumo.hide()


if __name__ == "__main__":
    cnx = connect("dbname=traza user=traza password=123 host=localhost")
    #cnx.autocommit()
    sys.excepthook=debugwindow.show
    w = wnInsumo(cnx)
    
    gtk.main()
    
